我們已經知道如何計算兩個向量之間的關聯性 α,接下來我們要將其應用到 Self-Attention 模組中,來生成最終的輸出向量 b_1
。
計算 Query 和 Key
將輸入向量 a_1
乘以矩陣 W_q
,得到向量 q_1
,這個向量被稱為 Query,類似於搜尋引擎中的關鍵字。接著,將其他輸入向量 a_2
、a_3
和 a_4
乘以矩陣 W_k
,分別得到向量 k_2
、k_3
和 k_4
,這些向量被稱為 Key。
計算 Attention Score
現在,我們要計算 a_1
與 a_2
、a_3
、a_4
的關聯性。具體來說,通過計算 q_1
與每個 k
向量的內積(dot product),得到它們的關聯分數,也就是 Attention Score,並且用 α 來表示。比如,q_1
與 k_2
的內積結果記作 α_{1,2}
,表示 a_1
與 a_2
之間的關聯性。同理,計算 q_1
與 k_3
和 k_4
的內積,得到 α_{1,3}
和 α_{1,4}
。此外,q_1
也會與 k_1
自己計算關聯性,這裡的結果為 α_{1,1}
。
Normalization 處理
當我們得到了 α_{1,1}
、α_{1,2}
、α_{1,3}
和 α_{1,4}
之後,接下來使用 Softmax(或其他激活函數) 函數將它們正規化,使這些分數成為一個概率分佈,得到新的 α 值(α'
)。Softmax 的作用在於將原來的關聯性進行縮放和歸一化,使其更適合作為權重。
抽取重要資訊
當我們有了 α'
之後,接下來要根據這些分數來抽取序列中的重要資訊。為此,將每個輸入向量 a_1
、a_2
、a_3
和 a_4
乘以一個矩陣 W_v
,得到新的向量 v_1
、v_2
、v_3
和 v_4
。然後,將這些 v
向量分別與對應的 α'
相乘,再進行加權求和,最終得到 b_1
。
這裡的概念是,與 a_1
關聯性越強的向量,其對最終結果 b_1
的影響越大。如果 a_1
與 a_2
的關聯性很強,那麼 b_1
的值就會更接近 v_2
。
生成 Q、K、V 向量:
a_i
都會生成三個不同的向量,分別是 Query q_i
、Key k_i
、和 Value v_i
。a_1
到 a_4
,通過與三個不同的參數矩陣(W_q
、W_k
、W_v
)相乘,分別生成 Q、K、V 向量。a_1
到 a_4
組合成矩陣 I
,則可以表示為:Q
、K
、V
矩陣的每一列(column)分別對應 q_1
到 q_4
、k_1
到 k_4
、v_1
到 v_4
。計算 Attention Scores:
q_i
都需要與每一個 Key k_j
計算內積(inner product),這可以用矩陣乘法來表示:A
是一個矩陣,其每個元素 α_{i,j}
代表 q_i
與 k_j
的內積結果(即 Attention Score)。K^T
表示 K
的轉置矩陣(圖片上的K是打橫的,表示是K^T
)。正規化:
A
會進行正規化。一般情況下會使用 Softmax 函數,對每一個 Query 所對應的列進行 Softmax 轉換,使得每一列的分數總和為 1:生成最終輸出:
A'
計算完成後,將其與 Value 向量矩陣 V
相乘,得到最終的輸出矩陣 O
:O
的每一列就是 Self-Attention 機制最終生成的輸出。Self-Attention 操作的本質其實就是一系列矩陣運算,唯一需要學習的參數是三個權重矩陣 W_q
、W_k
、和 W_v
。這三個矩陣是模型通過訓練數據來學習的,其他的操作如內積、轉置、正規化等則是已知且固定的。
Self-Attention 的運作從輸入矩陣 I
到輸出矩陣 O
的流程可以視為:
I
生成 Q
、K
、V
;Q
和 K
的相似度,得到 Attention Scores;V
進行加權求和,得到輸出 O
。這一連串操作雖然有個很好聼的名字叫做注意力機制,但從實際的運算角度來說,只是一系列的矩陣乘法與正規化操作。
今天對於計算的講解就到這裏,明天會介紹Self-Attention更加進階的運算,如果篇幅允許的話,可能還會介紹Transformer這個模型。
以上的内容來自於臺大教授李宏毅:鏈接,我只是把他的影片寫成了筆記。